package br.com.vendas.dao.impl;

import java.lang.reflect.ParameterizedType;
import java.util.List;

import br.com.main.Mapeamento;
import br.com.vendas.dao.IGenericDao;
import br.com.vendas.dominio.IEntity;
import br.com.vendas.utils.ValidatorUtil;

public class GenericDaoImpl<T extends IEntity> implements IGenericDao<T> {

	@Override
	public T findById(int id) {
		List<T> entidades = getEntidades();
		
		for( T entidade : entidades ) {
			if( entidade.getId() == id )
				return entidade;
		}

		return null;
	}

	@Override
	public int getNextId() {
		int id = 0;
		
		List<T> entidades = getEntidades();
		
		if (ValidatorUtil.isNotEmpty(entidades)){
			for (IEntity entidade : entidades){
				if (entidade.getId() > id)
					id = entidade.getId();
			}
		}
		
		return id+1;
	}

	@Override
	public boolean save(T entidade) {
		try {
			entidade.setId(getNextId());
			
			getEntidades().add(entidade);
			
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	@Override
	public boolean update(T entidade) {
		try {
			List<T> entidades = getEntidades();
			
			for( T _entidade : entidades ) {
				if( _entidade.getId() == entidade.getId() ) {
					entidades.set( entidades.indexOf(_entidade), entidade );
					break;
				}
			}
			
			return true;
		} catch (Exception e) {
			return false;
		}
		
	}
	
	@Override
	public boolean remove(T entidade) {
		try {
			List<T> entidades = getEntidades();
			
			return entidades.remove(entidade);
		} catch (Exception e) {
			return false;
		}
		
	}
	
	private List<T> getEntidades() {
		String nomeClasse = ((Class<T>) ((ParameterizedType) getClass()  
	             .getGenericSuperclass()).getActualTypeArguments()[0]).getName();
		
		List<T> entidades = Mapeamento.mapeamentos.get( nomeClasse );

		return entidades;
	}

}
